package com.xinzhi.service.impl;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.xinzhi.mapper.UserMapper;
import com.xinzhi.pojo.User;
import com.xinzhi.service.UserService;
import com.xinzhi.utils.RedisUtils;
import com.xinzhi.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private RedisUtils redisUtils;


    /**
     * 登录
     * @param account 账号
     * @param password 密码
     * @return
     */
    @Override
    public Result login(String account, String password) {
        //去Redis中查询
        String o = (String) redisUtils.get("userkey");
        //如果Redis中存在，则登录成功
        if (StrUtil.isNotEmpty(o)){
            return Result.ok("登录成功");
        }

        if (account == null || password == null){
            return Result.error(10,"账号或密码不能为空,请重新输入");
        }
        if (!isValidAccount(account)){
            return Result.error(10,"账号格式不正确,请输入6-12位的账号");
        }
        if (!isValidPassword(password)){
            return Result.error(10,"密码格式不正确,请输入大小写字母数字和特殊符号的8-12位密码");
        }

        //Redis中没有的话就去数据库中查询
        User user = userMapper.getUser(account, password);
        if (user == null){
            //防止穿透
            redisUtils.set("userkey","",3);
            return Result.error(250,"没有该账户");
        }
        //数据库中有这条消息，就把它放在Redis里面
        redisUtils.set("userkey",user.toString());
//        String s = DigestUtils.md5DigestAsHex(password.getBytes());
        return Result.ok("登录成功");
    }

    /**
     * 注册
     * @param user 用户信息
     * @return
     */
    @Override
    public Result insertUser(User user) {

        // 首先去 Redis 查询用户是否存在
        String userKey = "user:" + user.getAccount(); // 或者使用用户的ID作为键名的一部分
        String existingUserJson = (String) redisUtils.get(userKey);
        if (StrUtil.isNotBlank(existingUserJson)) {
            return Result.ok("该账号已经注册");
        }


        // 判断账号和密码是否符合要求
        if (user.getAccount() == null || !isValidAccount(user.getAccount())) {
            return Result.error(100, "账号格式错误");
        }
        if (user.getPassword() == null || !isValidPassword(user.getPassword())) {
            return Result.error(100, "密码格式错误");
        }

        // 如果 Redis 中不存在就去数据库中查询
        User existingUser = userMapper.selectAccount(user.getAccount());
        if (existingUser != null) {
            // 数据库中已存在相同账号的用户，放到Redis中，然后返回错误提示
            redisUtils.set(userKey, JSONUtil.toJsonStr(existingUser));
            return Result.error(100, "账号已存在");
        }

        // 用户既不存在 Redis 中也不存在数据库中，执行插入操作
        int adduser = userMapper.adduser(user);
        if (adduser > 0) {
            // 插入成功后将用户信息存入 Redis
            redisUtils.set(userKey, JSONUtil.toJsonStr(user));
            return Result.ok("注册成功");
        }

        return Result.error("添加失败");
    }



    /**
     *  验证账号格式
     * @param account 账号
     * @return
     */
    @Override
    public boolean isValidAccount(String account) {
        String accountPattern = "^[0-9]{6,12}$";
        return account.matches(accountPattern);
    }

    /**
     * 验证密码格式
     * @param password 密码
     * @return
     */
    @Override
    public boolean isValidPassword(String password) {
        String passwordPattern = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@#$%^&+=!.]).{8,12}$";
        return password.matches(passwordPattern);
    }
}
